<?php

/**
 * Description of Etudiant
 *
 * @author remi
 * @version 1.0
 * @links Utilisateur
 */
class Etudiant extends Utilisateur
{

    /**
     * @var int
     */
    private $IdPromo;
    /**
     * @var string
     */
    private $NomPromo;
    /**
     * @var string
     */
    protected $Adresse1;
    /**
     * @var string
     */
    protected $Adresse2;
    /**
     * @var int
     */
    protected $CP;
    /**
     * @var string
     */
    protected $Ville;

    /**
     *
     * @param int $id
     */
    public function __construct($id = 0)
    {
        parent::__construct($id);
        $this->setIdStatutUtilisateur(0);
        if (isset($id) && !empty($id))
        {
            // récup SQL de la promo
            $sql = SQL::getInstance()->getConnection();

            $query = "SELECT a.IdPromo as ID,b.NomPromo as NOM, a.* FROM Etudiant a
						INNER JOIN Promo b ON b.IdPromo = a.IdPromo
					 WHERE a.IdEtudiant = :id";
            $c = $sql->prepare($query);
            $c->bindParam(":id", $id, PDO::PARAM_INT);

            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);

                $this->IdPromo = $result->ID;
                $this->NomPromo = $result->NOM;

                // TODO : ADDRESSE
                $this->Adresse1 = $result->Adresse1Etudiant;
                $this->Adresse2 = $result->Adresse2Etudiant;
                $this->CP = $result->CPEtudiant;
                $this->Ville = $result->VilleEtudiant;

                $this->errormsg = "Etudiant recuperee";
                $this->requeteOk = true;
            }
            else
            {
                $this->IdPromo = 0;
                $this->Adresse1 = "";
                $this->Adresse2 = "";
                $this->CP = "";
                $this->Ville = "";

                $this->errormsg = "SQL Failed";
                $this->requeteOk = false;
            }
            $c->closeCursor();
        }
        else
        {
            $this->IdPromo = 0;
            $this->Adresse1 = "";
            $this->Adresse2 = "";
            $this->CP = "";
            $this->Ville = "";
        }
    }

    /**
     * Insert un Utilisateur dans la table
     * @see Utilisateur::insertUtilisateur()
     */
    public function insert()
    {
        $IdUtilisateur = parent::insertUtilisateur();

        if (!empty($IdUtilisateur))
        {
            $sql = SQL::getInstance()->getConnection();
            $query = "INSERT INTO Etudiant
					(
					idEtudiant,
					idPromo,
					Adresse1Etudiant,
					Adresse2Etudiant,
					CPEtudiant,
					VilleEtudiant
					)
					VALUES(
					:id,:promo,:ad1,:ad2,:cp,:ville
					)";

            $sql->beginTransaction();
            try
            {
                $c = $sql->prepare($query);

                $c->bindParam(':id', $IdUtilisateur, PDO::PARAM_INT);
                $c->bindParam(':promo', $this->IdPromo, PDO::PARAM_INT);
                $c->bindParam(':cp', $this->CP, PDO::PARAM_INT);

                $c->bindParam(':ad1', $this->Adresse1, PDO::PARAM_STR);
                $c->bindParam(':ad2', $this->Adresse2, PDO::PARAM_STR);
                $c->bindParam(':ville', $this->Ville, PDO::PARAM_STR);

                if ($c->execute())
                {
                    $sql->commit();
                    $c->closeCursor();
                    $this->requeteOk = true;
                    $this->errormsg = "";
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = $c->errorInfo();
                    $sql->rollback();
                    $c->closeCursor();
                    $this->Id = 0;
                }
            }
            catch (PDOException $Exception)
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
                $this->Id = 0;
            }
        }
        else
        {
            $this->requeteOk = false;
            $this->errormsg = $this->errormsg;
        }
    }

    /**
     * Met à jour un etudiant dans la base
     * @see Utilisateur::updateUtilisateur()
     */
    public function update()
    {
        parent::updateUtilisateur();
        if ($this->requeteOk === true)
        {
            $sql = SQL::getInstance()->getConnection();
            $query = "UPDATE Etudiant SET
						idPromo = :promo,
						Adresse1Etudiant = :ad1,
						Adresse2Etudiant = :ad2,
						CPEtudiant = :cp,
						VilleEtudiant = :ville
					WHERE idEtudiant = :id";
            $sql->beginTransaction();
            try
            {
                $c = $sql->prepare($query);

                $c->bindParam(':id', $this->Id, PDO::PARAM_INT);
                $c->bindParam(':promo', $this->IdPromo, PDO::PARAM_INT);
                $c->bindParam(':cp', $this->CP, PDO::PARAM_INT);

                $c->bindParam(':ad1', $this->Adresse1, PDO::PARAM_STR);
                $c->bindParam(':ad2', $this->Adresse2, PDO::PARAM_STR);
                $c->bindParam(':ville', $this->Ville, PDO::PARAM_STR);

                if ($c->execute())
                {
                    $sql->commit();
                    $c->closeCursor();
                    $this->requeteOk = true;
                    $this->errormsg = "";
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = $c->errorInfo();
                    $sql->rollback();
                    $c->closeCursor();
                }
            }
            catch (PDOException $Exception)
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
            }
        }
        else
        {
            $this->requeteOk = false;
            $this->errormsg = $this->errormsg;
        }
    }

    /**
     *
     * @return int
     */
    public function getIdPromo()
    {
        return $this->IdPromo;
    }

    /**
     *
     * @param int $IdPromo
     * @return mixed
     */
    public function setIdPromo($IdPromo)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        if (isset($IdPromo) && !empty($IdPromo))
        {
            $this->IdPromo = $IdPromo;
            $this->errormsg = "";
        }
        else
        {
            $this->IdPromo = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getPromo()
    {
        return $this->NomPromo;
    }

    /**
     *
     * @param string $nomM
     * @return mixed
     */
    public function setAdresse1($nomM)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        if (isset($nomM) && $nomM != "" && strlen($nomM) < 255)
        {
            $this->Adresse1 = htmlentities($nomM);
            $this->errormsg = "";
        }
        else
        {
            if (isset($nomM) && strlen($nomM) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse doit Ãªtre compris entre 1 et 255 caractÃ¨res !";
            }

            $this->Adresse1 = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getAdresse1()
    {
        return stripslashes($this->Adresse1);
    }

    /**
     *
     * @param string $nomM
     * @return mixed
     */
    public function setAdresse2($nomM)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        if (isset($nomM) && strlen($nomM) < 255)
        {
            $this->Adresse2 = htmlentities($nomM);
            $this->errormsg = "";
        }
        else
        {
            if (isset($nomM) && strlen($nomM) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse complÃ©mentaire doit Ãªtre compris entre 0 et 255 caractÃ¨res !";
            }
            $this->Adresse2 = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getAdresse2()
    {
        return stripslashes($this->Adresse2);
    }

    /**
     *
     * @param int $nomM
     * @return mixed
     */
    public function setCP($nomM)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        if (isset($nomM) && $nomM != "" && strlen($nomM) < 6)
        {
            $this->CP = $nomM;
            $this->errormsg = "";
        }
        else
        {
            if (isset($nomM) && strlen($nomM) > 6)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le code postal doit Ãªtre compris entre 1 et 5 caractÃ¨res !";
            }
            $this->CP = "";
        }
        return $errTab;
    }

    /**
     *
     * @return int
     */
    public function getCP()
    {
        if (strlen($this->CP) == 4)
            $this->CP = "0" . $this->CP;
        return $this->CP;
    }

    /**
     *
     * @param string $nomM
     * @return mixed
     */
    public function setVille($nomM)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        if (isset($nomM) && $nomM != "" && strlen($nomM) < 200)
        {
            $this->Ville = htmlentities($nomM);
            $this->errormsg = "";
        }
        else
        {
            if (isset($nomM) && strlen($nomM) > 200)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La ville doit Ãªtre compris entre 1 et 200 caractÃ¨res !";
            }
            $this->Ville = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getVille()
    {
        return stripslashes($this->Ville);
    }

    /**
     * @static
     * @param int $limit
     * @param int $begin
     * @param string $name
     * @param int $promo
     * @return mixed Array d'Etudiant
     */
    static public function getList($limit=0, $begin=0, $name="", $promo=0)
    {
        if (empty($limit))
        {
            $sql = SQL::getInstance()->getConnection();
            $query = 'SELECT Utilisateur.* FROM Utilisateur';
            $c = $sql->query($query);
            $result = $c->fetchAll(PDO::FETCH_OBJ);
            return $result;
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            $query = 'SELECT Utilisateur.*, Etudiant.*
						  FROM Utilisateur
						  INNER JOIN Etudiant ON Etudiant.idEtudiant = Utilisateur.IdUtilisateur
						  WHERE StatutUtilisateur = "0"';
            if (!empty($name))
            {
                $query .= " AND ( NomUtilisateur LIKE CONCAT('%', :nom, '%')  OR PrenomUtilisateur LIKE CONCAT('%', :prenom, '%') OR EmailUtilisateur LIKE CONCAT('%', :mail, '%'))";
            }
            if (!empty($promo))
                $query .= "AND idPromo = :promo";

            $query .= ' LIMIT :begin,:limit';
            $c = $sql->prepare($query);
            $c->bindParam(':begin', $begin, PDO::PARAM_INT);
            $c->bindParam(':limit', $limit, PDO::PARAM_INT);
            if (!empty($name))
            {
                $c->bindParam(':nom', $name, PDO::PARAM_STR);
                $c->bindParam(':prenom', $name, PDO::PARAM_STR);
                $c->bindParam(':mail', $name, PDO::PARAM_STR);
            }
            //var_dump($name);
            if (!empty($promo))
                $c->bindParam(":promo", $promo, PDO::PARAM_INT);
            if ($c->execute())
            {
                $result = $c->fetchAll(PDO::FETCH_OBJ);
                return $result;
            }
            else
            {
                return array();
            }
        }
    }

    /**
     *
     * @param string $name
     * @param int $promo
     * @return int Nombre total d'Etudiant
     */
    static public function globalCount($name="", $promo =0)
    {
        $sql = SQL::getInstance()->getConnection();
        $query = 'SELECT COUNT(IdUtilisateur) as count
				  FROM Utilisateur
				  INNER JOIN Etudiant ON Etudiant.idEtudiant = Utilisateur.IdUtilisateur
				  WHERE StatutUtilisateur = "0"';
        if (!empty($name))
        {
            $query .= " AND ( NomUtilisateur LIKE CONCAT('%', :nom, '%')  OR PrenomUtilisateur LIKE CONCAT('%', :prenom, '%') OR EmailUtilisateur LIKE CONCAT('%', :mail, '%'))";
        }
        if (!empty($promo))
            $query .= "AND idPromo = :promo";

        $c = $sql->prepare($query);
        if (!empty($name))
        {
            $c->bindParam(':nom', $name, PDO::PARAM_STR);
            $c->bindParam(':prenom', $name, PDO::PARAM_STR);
            $c->bindParam(':mail', $name, PDO::PARAM_STR);
        }
        //var_dump($name);
        if (!empty($promo))
            $c->bindParam(":promo", $promo, PDO::PARAM_INT);
        if ($c->execute())
        {
            $result = $c->fetch(PDO::FETCH_OBJ);
            return $result->count;
        }
        else
        {
            return 0;
        }
    }

    /**
     * Permet de savoir si un etudiant a deja cree une fiche de stage
     * @return boolean
     */
    public function canSubmitStage()
    {
        $sql = SQL::getInstance()->getConnection();
        $query = '
                    SELECT COUNT(IdEtudiant) as count
                    FROM Stage
                    WHERE Stage.IdEtudiant = :id
                ';

        $c = $sql->prepare($query);
        $c->bindParam(':id', $this->Id, PDO::PARAM_INT);
        if ($c->execute())
        {
            $result = $c->fetch(PDO::FETCH_OBJ);
            if( $result->count == 0 ){
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

}

?>
